home *** CD-ROM | disk | FTP | other *** search
/ Stone Design / Stone Design.iso / Stone_Friends / Wave / WavesWorld / Source / IBPalettes / WW3DKit / vnoise.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-03-22  |  1.1 KB  |  62 lines

  1. #include "proctext.h"
  2. #include "noise.h"
  3.  
  4. static float valueTab[TABSIZE];
  5.  
  6. static void valueTabInit(int seed);
  7. static float vlattice(int ix, int iy, int iz);
  8.  
  9. float
  10. vnoise(float x, float y, float z)
  11. {
  12.     int ix, iy, iz;
  13.     int i, j, k;
  14.     float fx, fy, fz;
  15.     float xknots[4], yknots[4], zknots[4];
  16.     static int initialized = 0;
  17.  
  18.     if (!initialized) {
  19.         valueTabInit(665);
  20.         initialized = 1;
  21.     }
  22.  
  23.     ix = FLOOR(x);
  24.     fx = x - ix;
  25.  
  26.     iy = FLOOR(y);
  27.     fy = y - iy;
  28.  
  29.     iz = FLOOR(z);
  30.     fz = z - iz;
  31.  
  32.     for (k = -1; k <= 2; k++) {
  33.         for (j = -1; j <= 2; j++) {
  34.             for (i = -1; i <= 2; i++)
  35.                 xknots[i+1] = vlattice(ix+i,iy+j,iz+k);
  36.             yknots[j+1] = spline(fx, 4, xknots);
  37.         }
  38.         zknots[k+1] = spline(fy, 4, yknots);
  39.     }
  40.     return spline(fz, 4, zknots);
  41. }
  42.  
  43. static void
  44. valueTabInit(int seed)
  45. {
  46.     float *table = valueTab;
  47.     int i;
  48.     extern long random();
  49.     extern long srandom();
  50.  
  51.  
  52.     srandom(seed);
  53.     for(i = 0; i < TABSIZE; i++)
  54.         *table++ = 1. - 2.*RANDNBR;
  55. }
  56.  
  57. static float
  58. vlattice(int ix, int iy, int iz)
  59. {
  60.     return valueTab[INDEX(ix,iy,iz)];
  61. }
  62.